5508
1247
Κατά λάθος διέπραξα λάθος αρχεία στο Git, αλλά δεν ώθησα ακόμα τη δέσμευση στον διακομιστή.
Πώς μπορώ να αναιρέσω αυτές τις δεσμεύσεις από το τοπικό αποθετήριο; 
1
2
3
Επόμενο
Αναίρεση δέσμευσης & επανάληψη
$ git commit -m "Κάτι εξαιρετικά λανθασμένο" # (0: Το ατύχημα σας)
$ git reset HEAD ~ # (1)
<< επεξεργασία αρχείων όπως απαιτείται >> # (2)
$ git προσθήκη. # (3)
$ git commit -c ORIG_HEAD # (4)
Αυτή η εντολή είναι υπεύθυνη για την αναίρεση. Θα ακυρώσει την τελευταία σας δέσμευση, αφήνοντας ανέπαφο το δέντρο εργασίας σας (την κατάσταση των αρχείων σας στο δίσκο). Θα πρέπει να τα προσθέσετε ξανά για να τα δεσμεύσετε ξανά).
Πραγματοποιήστε διορθώσεις στα αρχεία δέντρων εργασίας.
git προσθέστε οτιδήποτε θέλετε να συμπεριλάβετε στη νέα σας δέσμευση.
Δεσμεύστε τις αλλαγές, επαναχρησιμοποιώντας το παλιό μήνυμα δέσμευσης. επαναφορά αντιγράφηκε η παλιά κεφαλή στο .git / ORIG_HEAD; Η δέσμευση με -c Το ORIG_HEAD θα ανοίξει έναν επεξεργαστή, ο οποίος αρχικά περιέχει το μήνυμα καταγραφής από την παλιά δέσμευση και σας επιτρέπει να το επεξεργαστείτε. Εάν δεν χρειάζεται να επεξεργαστείτε το μήνυμα, θα μπορούσατε να χρησιμοποιήσετε την επιλογή -C.
Εναλλακτικά, για να επεξεργαστείτε την προηγούμενη δέσμευση (ή απλά το μήνυμα δέσμευσης), η δέσμευση - τροποποίηση θα προσθέσει αλλαγές στον τρέχοντα δείκτη στην προηγούμενη δέσμευση.
Για να καταργήσετε (να μην επαναφέρετε) μια δέσμευση που έχει προωθηθεί στον διακομιστή, απαιτείται επανεγγραφή του ιστορικού με το αρχικό git push origin --force.
Περαιτέρω ανάγνωση
Πώς μπορώ να μετακινήσω το HEAD πίσω σε προηγούμενη τοποθεσία; (Αποσυνδεδεμένη κεφαλή) & Αναίρεση δεσμεύσεων
Η παραπάνω απάντηση θα σας δείξει το git reflog, το οποίο μπορείτε να χρησιμοποιήσετε για να προσδιορίσετε το SHA-1 για τη δέσμευση στην οποία θέλετε να επαναφέρετε. Μόλις έχετε αυτήν την τιμή, χρησιμοποιήστε την ακολουθία εντολών όπως εξηγείται παραπάνω.
Το HEAD ~ είναι το ίδιο με το HEAD ~ 1. Το άρθρο Τι είναι το HEAD in git; είναι χρήσιμο εάν θέλετε να αποδεσμεύσετε πολλές δεσμεύσεις.
|
Η αναίρεση μιας δέσμευσης είναι λίγο τρομακτική εάν δεν ξέρετε πώς λειτουργεί. Αλλά είναι πραγματικά απίστευτα εύκολο αν καταλαβαίνετε. Θα σας δείξω τους 4 διαφορετικούς τρόπους με τους οποίους μπορείτε να αναιρέσετε μια δέσμευση.
επιλογή 1: επαναφορά git - σκληρό
Ας πούμε ότι έχετε αυτό, όπου το C είναι το HEAD σας και το (F) είναι η κατάσταση των αρχείων σας.
(ΦΑ)
ΑΛΦΑΒΗΤΟ
↑
κύριος
Θέλετε να nuke comm C και να μην το ξαναδείτε ποτέ και να χάσετε όλες τις αλλαγές σε τοπικά τροποποιημένα αρχεία. Το κάνετε αυτό:
επαναφορά git - σκληρό HEAD ~ 1
Το αποτέλεσμα είναι:
(ΦΑ)
Α-Β
↑
κύριος
Τώρα το Β είναι το ΚΕΦΑΛΙ. Επειδή χρησιμοποιήσατε - σκληρά, τα αρχεία σας επαναφέρονται στην κατάστασή τους στη δέσμευση Β.
επιλογή 2: επαναφορά git
Α, αλλά ας υποθέσουμε ότι η δέσμευση Γ δεν ήταν καταστροφή, αλλά λίγο μακριά. Θέλετε να αναιρέσετε τη δέσμευση, αλλά διατηρήστε τις αλλαγές σας για λίγη επεξεργασία προτού κάνετε μια καλύτερη δέσμευση. Ξεκινώντας ξανά από εδώ, με το C ως HEAD σας:
(ΦΑ)
ΑΛΦΑΒΗΤΟ
↑
κύριος
Μπορείτε να το κάνετε αυτό, αφήνοντας το --hard:
git reset HEAD ~ 1
Σε αυτήν την περίπτωση το αποτέλεσμα είναι:
(ΦΑ)
ΑΛΦΑΒΗΤΟ
↑
κύριος
Και στις δύο περιπτώσεις, το HEAD είναι απλώς δείκτης της τελευταίας δέσμευσης. Όταν κάνετε ένα git reset HEAD ~ 1, λέτε στο Git να μετακινήσει το δείκτη HEAD πίσω σε μια δέσμευση. Αλλά (εκτός αν χρησιμοποιείτε - σκληρό) αφήνετε τα αρχεία σας όπως ήταν. Τώρα λοιπόν η κατάσταση git δείχνει τις αλλαγές που έχετε ελέγξει στο C. Δεν έχετε χάσει τίποτα!
επιλογή 3: επαναφορά git - soft
Για το ελαφρύτερο άγγιγμα, μπορείτε ακόμη και να αναιρέσετε τη δέσμευσή σας, αλλά να αφήσετε τα αρχεία και το ευρετήριό σας:
επαναφορά git - soft HEAD ~ 1
Αυτό δεν αφήνει μόνο τα αρχεία σας μόνο, αλλά αφήνει και το ευρετήριό σας μόνο. Όταν κάνετε την κατάσταση git, θα δείτε ότι τα ίδια αρχεία βρίσκονται στο ευρετήριο όπως και πριν. Στην πραγματικότητα, αμέσως μετά από αυτήν την εντολή, θα μπορούσατε να κάνετε git commit και θα επαναλάβετε την ίδια δέσμευση που είχατε μόλις.
επιλογή 4: κάνατε επαναφορά git - σκληρό και πρέπει να λάβετε ξανά αυτόν τον κωδικό
Ένα ακόμη πράγμα: Ας υποθέσουμε ότι καταστρέφετε μια δέσμευση όπως στο πρώτο παράδειγμα, αλλά στη συνέχεια ανακαλύπτετε ότι το χρειάζεστε τελικά; Σκληρή τύχη, σωστά;
Όχι, υπάρχει ακόμα τρόπος να το πάρετε πίσω. Πληκτρολογήστε git reflog και θα δείτε μια λίστα (μερικών) δεσμεύσεων (δηλαδή κατακερματισμών) που έχετε μετακινηθεί. Βρείτε τη δέσμευση που καταστράφηκε και κάντε το:
git checkout -b someNewBranchName shaYouDestroyed
Τώρα αναστήσατε αυτή τη δέσμευση. Οι δεσμεύσεις στην πραγματικότητα δεν καταστρέφονται στο Git για περίπου 90 ημέρες, οπότε συνήθως μπορείτε να επιστρέψετε και να σώσετε αυτό που δεν θέλατε να ξεφορτωθείτε.
|
Υπάρχουν δύο τρόποι για "αναίρεση" της τελευταίας σας δέσμευσης, ανάλογα με το αν έχετε ήδη δημοσιοποιήσει ή όχι (προωθήθηκε στο απομακρυσμένο αποθετήριο):
Πώς να αναιρέσετε μια τοπική δέσμευση
Ας πούμε ότι δεσμεύτηκα τοπικά, αλλά τώρα θέλω να καταργήσω αυτήν την δέσμευση.
git log
commit 101: bad comm # Τελευταία δέσμευση. Αυτό θα ονομαζόταν «HEAD».
δέσμευση 100: καλή δέσμευση # Δεύτερη έως τελευταία δέσμευση. Αυτό είναι αυτό που θέλουμε.
Για να επαναφέρουμε τα πάντα στον τρόπο που ήταν πριν από την τελευταία δέσμευση, πρέπει να επαναφέρουμε τη δέσμευση πριν από το HEAD:
git reset --soft HEAD ^ # Χρησιμοποιήστε το --soft εάν θέλετε να διατηρήσετε τις αλλαγές σας
git reset --hard HEAD ^ # Χρησιμοποιήστε το - hard αν δεν σας ενδιαφέρει να διατηρήσετε τις αλλαγές που κάνατε
Τώρα το git log θα δείξει ότι η τελευταία μας δέσμευση έχει καταργηθεί.
Πώς να αναιρέσετε μια δημόσια δέσμευση
Εάν έχετε ήδη δημοσιοποιήσει τις δεσμεύσεις σας, θα θελήσετε να δημιουργήσετε μια νέα δέσμευση που θα "επαναφέρει" τις αλλαγές που κάνατε στην προηγούμενη δέσμευσή σας (τρέχουσα HEAD).
git επαναφορά HEAD
Οι αλλαγές σας θα αντιστραφούν τώρακαι έτοιμοι να δεσμεύσετε:
git commit -m "Επαναφορά του αρχείου που κατάργησα κατά λάθος"
git log
commit 102: Επαναφορά του αρχείου που κατάργησα κατά λάθος
commit 101: αφαίρεση ενός αρχείου που δεν χρειαζόμαστε
δεσμεύστε 100: προσθέτοντας ένα αρχείο που χρειαζόμαστε
Για περισσότερες πληροφορίες, ανατρέξτε στο Git Basics - Αναίρεση πραγμάτων.
|
Προσθέστε / αφαιρέστε αρχεία για να λάβετε τα πράγματα με τον τρόπο που θέλετε:
git rm classdir
git προσθέστε sourcedir
Στη συνέχεια, τροποποιήστε τη δέσμευση:
git comm - τροποποίηση
Η προηγούμενη, εσφαλμένη δέσμευση θα επεξεργαστεί για να αντικατοπτρίζει τη νέα κατάσταση ευρετηρίου - με άλλα λόγια, θα ήταν σαν να μην κάνατε ποτέ το λάθος στην πρώτη θέση.
Λάβετε υπόψη ότι θα πρέπει να το κάνετε αυτό μόνο εάν δεν έχετε προωθήσει ακόμα. Εάν έχετε πιέσει, τότε θα πρέπει απλώς να κάνετε μια διόρθωση κανονικά.
|
git rm yourfiles / *. τάξη
git commit -a -m "διαγράφηκαν όλα τα αρχεία τάξης στο φάκελο 'yourfiles'"
ή
επαναφορά git - σκληρό HEAD ~ 1
Προειδοποίηση: Η παραπάνω εντολή θα καταργήσει οριστικά τις τροποποιήσεις στα αρχεία .java (και σε οποιαδήποτε άλλα αρχεία) που θέλετε να δεσμεύσετε.
Η σκληρή επαναφορά στο HEAD-1 θα ρυθμίσει το αντίγραφο εργασίας σας στην κατάσταση της δέσμευσης πριν από τη λάθος δέσμευση.
|
Για να αλλάξετε την τελευταία δέσμευση
Αντικαταστήστε τα αρχεία στο ευρετήριο:
git rm - cached * .class
git add * .java
Στη συνέχεια, εάν πρόκειται για ιδιωτικό υποκατάστημα, τροποποιήστε τη δέσμευση:
git comm - τροποποίηση
Ή, εάν πρόκειται για κοινόχρηστο κλάδο, κάντε μια νέα δέσμευση:
git commit -m "Αντικατάσταση αρχείων .class με αρχεία .java"
(Για να αλλάξετε μια προηγούμενη δέσμευση, χρησιμοποιήστε την εκπληκτική διαδραστική επαναφορά.)
ProTip ™: Προσθέστε το * .class σε ένα gitignore για να σταματήσετε να συμβαίνει ξανά.
Για να επαναφέρετε μια δέσμευση
Η τροποποίηση μιας δέσμευσης είναι η ιδανική λύση εάν πρέπει να αλλάξετε την τελευταία δέσμευση, αλλά επαναφέρεται μια πιο γενική λύση.
Μπορείτε να επαναφέρετε το Git σε οποιαδήποτε δέσμευση με:
git reset @ ~ N
Όπου N είναι ο αριθμός των δεσμεύσεων πριν από το HEAD και το @ ~ επαναφέρεται στην προηγούμενη δέσμευση.
Έτσι, αντί να τροποποιήσετε τη δέσμευση, θα μπορούσατε να χρησιμοποιήσετε:
git reset @ ~
git add * .java
git commit -m "Προσθήκη αρχείων .java"
Ρίξτε μια ματιά στο git help reset, συγκεκριμένα στις ενότητες --soft --mixed και --hard, για καλύτερη κατανόηση του τι κάνει.
Reflog
Εάν κάνετε λάθος, μπορείτε πάντα να χρησιμοποιήσετε το reflog για να βρείτε δεσμευμένες δεσμεύσεις:
$ git reset @ ~
$ git reflog
c4f708b HEAD @ {0}: reset: μετακίνηση σε @ ~
2c52489 HEAD @ {1}: commit: πρόσθεσε ορισμένα αρχεία .class
Επαναφορά $ git 2c52489
... και επέστρεψες από εκεί που ξεκίνησες
|
Χρησιμοποιήστε το git revert .
Για να λάβετε το αναγνωριστικό δέσμευσης, απλώς χρησιμοποιήστε το αρχείο καταγραφής git.
|
Εάν σκοπεύετε να αναιρέσετε εντελώς μια τοπική δέσμευση, ό, τι κι αν αλλάξετε κάνατε στη δέσμευση, και αν δεν ανησυχείτε για αυτό, απλώς κάντε την ακόλουθη εντολή.
επαναφορά git - σκληρό HEAD ^ 1
(Αυτή η εντολή θα αγνοήσει ολόκληρη τη δέσμευσή σας και οι αλλαγές σας θα χαθούν εντελώς από το τοπικό δέντρο εργασίας σας). Εάν θέλετε να αναιρέσετε τη δέσμευσή σας, αλλά θέλετε τις αλλαγές σας στην περιοχή σταδιοποίησης (πριν από τη δέσμευση ακριβώς όπως μετά την προσθήκη git), κάντε την ακόλουθη εντολή.
επαναφορά git - soft HEAD ^ 1
Τώρα τα δεσμευμένα αρχεία σας μπαίνουν στην περιοχή σταδιοποίησης. Ας υποθέσουμε ότι εάν θέλετε να ανεβάσετε τα αρχεία, επειδή πρέπει να επεξεργαστείτε κάποιο λάθος περιεχόμενο, κάντε την ακόλουθη εντολή
git reset HEAD
Τώρα δεσμεύτηκαν αρχεία να προέρχονται από τη σταδιακή περιοχή στη μη σταδιακή περιοχή. Τώρα τα αρχεία είναι έτοιμα για επεξεργασία, οπότε ό, τι αλλάζετε, θέλετε να το επεξεργαστείτε και να το προσθέσετε και να κάνετε μια νέα / νέα δέσμευση.
Περισσότερα (σπασμένος σύνδεσμος) (Αρχειοθετημένη έκδοση)
|
Εάν έχετε εγκαταστήσει το Git Extras, μπορείτε να εκτελέσετε το git undo για να αναιρέσετε την τελευταία δέσμευση. Το git undo 3 θα αναιρέσει τις τρεις τελευταίες δεσμεύσεις.
|
Ήθελα να αναιρέσω τις τελευταίες πέντε δεσμεύσεις στο κοινόχρηστο αποθετήριο μας. Έψαξα το αναγνωριστικό αναθεώρησης στο οποίο ήθελα να επαναφέρω. Στη συνέχεια, πληκτρολόγησα τα ακόλουθα.
προτροπή> επαναφορά git - σκληρό 5a7404742c85
Το HEAD είναι τώρα στο 5a74047 Προστέθηκε μία ακόμη σελίδα στον κατάλογο
προτροπή> git push origin master --force
Σύνολο 0 (δέλτα 0), επαναχρησιμοποιήθηκε 0 (δέλτα 0)
απομακρυσμένο: bb / acl: neoneye επιτρέπεται. αποδεκτό ωφέλιμο φορτίο.
Προς το git@bitbucket.org: thecompany / prometheus.git
+ 09a6480 ... 5a74047 master -> master (αναγκαστική ενημέρωση)
προτροπή>
|
Προτιμώ να χρησιμοποιήσω το git rebase -i για αυτήν τη δουλειά, γιατί εμφανίζεται μια ωραία λίστα όπου μπορώ να επιλέξω τις δεσμεύσεις που θα ξεφορτωθώ. Μπορεί να μην είναι τόσο άμεσο όσο κάποιες άλλες απαντήσεις εδώ, αλλά αισθάνεται σωστά.
Επιλέξτε πόσες δεσμεύσεις θέλετε να καταχωρίσετε και, στη συνέχεια, επικαλέστε έτσι (για να εγγραφείτε στις τρεις τελευταίες)
git rebase -i HEAD ~ 3
Λίστα δειγμάτων
επιλέξτε aa28ba7 Έλεγχος υγιεινής για θύρα RtmpSrv
επιλέξτε c26c541 RtmpSrv επιλογή έκδοσης
επιλέξτε 58d6909 Καλύτερη υποστήριξη αποκωδικοποίησης URL
Στη συνέχεια, το Git θα αφαιρέσει δεσμεύσεις για οποιαδήποτε γραμμή που καταργείτε.
|
Πώς να διορθώσετε την προηγούμενη τοπική δέσμευση
Χρησιμοποιήστε το git-gui (ή παρόμοιο) για να εκτελέσετε μια εντολή git - τροποποιήστε. Από το GUI μπορείτε να προσθέσετε ή να αφαιρέσετε μεμονωμένα αρχεία από τη δέσμευση. Μπορείτε επίσης να τροποποιήσετε το μήνυμα δέσμευσης.
Πώς να αναιρέσετε την προηγούμενη τοπική δέσμευση
Απλώς επαναφέρετε το υποκατάστημα σας στην προηγούμενη τοποθεσία (για παράδειγμα, χρησιμοποιώντας το gitk ή το git rebase). Στη συνέχεια, εφαρμόστε ξανά τις αλλαγές σας από ένα αποθηκευμένο αντίγραφο. Μετά τη συλλογή απορριμμάτων στο τοπικό αποθετήριό σας, θα είναι σαν να μην συνέβη ποτέ η ανεπιθύμητη ενέργεια. Για να κάνετε όλα αυτά σε μία εντολή, χρησιμοποιήστε το git reset HEAD ~ 1.
Λέξηπροειδοποίησης: Η απρόσεκτη χρήση της επαναφοράς git είναι ένας καλός τρόπος για να μεταφέρετε το αντίγραφο εργασίας σας σε κατάσταση σύγχυσης. Συνιστώ στους αρχάριους του Git να το αποφεύγουν αν μπορούν.
Πώς να αναιρέσετε μια δημόσια δέσμευση
Εκτελέστε μια αντίστροφη επιλογή κερασιάς (git-revert) για να αναιρέσετε τις αλλαγές.
Εάν δεν έχετε τραβήξει ακόμα άλλες αλλαγές στο υποκατάστημα σας, μπορείτε απλά να κάνετε ...
git revert - χωρίς επεξεργασία HEAD
Στη συνέχεια, σπρώξτε τον ενημερωμένο κλάδο σας στο κοινόχρηστο αποθετήριο.
Το ιστορικό δεσμεύσεων θα εμφανίζει ξεχωριστά και τις δύο δεσμεύσεις.
Advanced: Διόρθωση του ιδιωτικού κλάδου σε δημόσιο αποθετήριο
Αυτό μπορεί να είναι επικίνδυνο - βεβαιωθείτε ότι έχετε ένα τοπικό αντίγραφο του υποκαταστήματος για να το σπρώξετε.
Σημείωση: Δεν θέλετε να το κάνετε αυτό εάν κάποιος άλλος μπορεί να εργάζεται στο υποκατάστημα.
git push --delete (branch_name) ## κατάργηση δημόσιας έκδοσης του κλάδου
Καθαρίστε το υποκατάστημα σας τοπικά και μετά σπρώξτε ...
προέλευση git push (όνομα_κλάδου)
Στην κανονική περίπτωση, πιθανότατα δεν χρειάζεται να ανησυχείτε ότι το ιστορικό δεσμεύσεων ιδιωτικών υποκαταστημάτων σας είναι παρθένο. Απλώς πιέστε μια επόμενη δέσμευση (δείτε "Πώς να αναιρέσετε μια δημόσια δέσμευση" παραπάνω) και αργότερα, κάντε μια συγχώνευση σκουός για να κρύψετε το ιστορικό.
|
Εάν θέλετε να το αναιρέσετε οριστικά και έχετε κλωνοποιήσει κάποιο αποθετήριο
Το αναγνωριστικό δέσμευσης μπορεί να δει από
git log
Τότε μπορείτε να κάνετε -
επαναφορά git - σκληρό 
προέλευση git push  -f
|
Εάν έχετε διαπράξει σκουπίδια αλλά δεν πιέζεστε,
επαναφορά git - soft HEAD ~ 1
Το HEAD ~ 1 είναι συντομογραφία για τη δέσμευση πριν από το κεφάλι. Εναλλακτικά, μπορείτε να ανατρέξετε στο SHA-1 του κατακερματισμού εάν θέλετε να κάνετε επαναφορά στο. - Η επιλογή Soft θα διαγράψει την δέσμευση, αλλά θα αφήσει όλα τα αλλαγμένα αρχεία σας "Αλλαγές που πρέπει να δεσμευτούν", όπως θα το έβαλε η κατάσταση git.
Εάν θέλετε να απαλλαγείτε από τυχόν αλλαγές στα αρχεία που παρακολουθούνται στο δέντρο εργασίας, από την αρχή πριν από τη χρήση, χρησιμοποιήστε το "- σκληρό".
Ή
Εάν έχετε ήδη σπρώξει και κάποιος τραβήξει που είναι συνήθως δική μου περίπτωση, δεν μπορείτε να χρησιμοποιήσετε το git reset. Μπορείτε ωστόσο να κάνετε μια επαναφορά git,
git επαναφορά HEAD
Αυτό θα δημιουργήσει μια νέα δέσμευση που αντιστρέφει όλα όσα εισήγαγε η τυχαία δέσμευση.
|
Στο SourceTree (GUI για GitHub), μπορείτε να κάνετε δεξί κλικ στη δέσμευση και να κάνετε "Αντίστροφη δέσμευση". Αυτό θα πρέπει να αναιρέσει τις αλλαγές σας.
Στο τερματικό:
Μπορείτε εναλλακτικά να χρησιμοποιήσετε:
επαναφορά git
Ή:
git reset --soft HEAD ^ # Χρησιμοποιήστε το --soft εάν θέλετε να διατηρήσετε τις αλλαγές σας.
git reset --hard HEAD ^ # Χρησιμοποιήστε το - hard αν δεν σας ενδιαφέρει να διατηρήσετε τις αλλαγές σας.
|
Μια μεμονωμένη εντολή:
επαναφορά git - μαλακό "HEAD ^"
Λειτουργεί υπέροχα για την αναίρεση της τελευταίας τοπικής δέσμευσης!
|
Απλώς επαναφέρετε το κάνοντας την παρακάτω εντολή χρησιμοποιώντας το git:
επαναφορά git - soft HEAD ~ 1
Εξηγήστε: τι κάνει η επαναφορά του git, είναι βασικά επαναφορά σε οποιαδήποτε δέσμευση στην οποία θέλετε να επιστρέψετε και, στη συνέχεια, εάν το συνδυάσετε με το --soft key, θα επιστρέψει, αλλά διατηρήστε τις αλλαγές στα αρχεία σας, έτσι επιστρέφετε στο στάδιο στο οποίο μόλις προστέθηκε το αρχείο, το HEAD είναι ο επικεφαλής του κλάδου και εάν συνδυάσετε με ~ 1 (σε αυτήν την περίπτωση χρησιμοποιείτε επίσης HEAD ^), θα επιστρέψει μόνο μία δέσμευση που θέλετε. ..
Δημιουργώ τα βήματα στην παρακάτω εικόνα για περισσότερες λεπτομέρειες για εσάς, συμπεριλαμβανομένων όλων των βημάτων που μπορεί να συμβούν σε πραγματικές καταστάσεις και δεσμεύοντας τον κωδικό:
|
Πώς να αναιρέσετε την τελευταία δέσμευση Git;
Για να επαναφέρουμε τα πάντα στον τρόπο που ήταν πριν από την τελευταία δέσμευση, πρέπει να επαναφέρουμε τη δέσμευση πριν από το HEAD.
Εάν δεν θέλετε να διατηρήσετε τις αλλαγές που κάνατε:
επαναφορά git - σκληρό HEAD ^
Εάν θέλετε να διατηρήσετε τις αλλαγές σας:
επαναφορά git - soft HEAD ^
Τώρα ελέγξτε το αρχείο καταγραφής git. Θα δείξει ότι η τελευταία μας δέσμευση καταργήθηκε.
|
"Επαναφέρετε το δέντρο εργασίας στην τελευταία δέσμευση"
επαναφορά git - σκληρό HEAD ^
"Καθαρίστε άγνωστα αρχεία από το δέντρο εργασίας"
καθαρίστε
δείτε - Git Quick Reference
ΣΗΜΕΙΩΣΗ: Αυτή η εντολή θα διαγράψει την προηγούμενη δέσμευσή σας, οπότε χρησιμοποιήστε με προσοχή! επαναφορά git - το σκληρό είναι ασφαλέστερο.
|
Χρησιμοποιήστε το reflog για να βρείτε μια σωστή κατάσταση
git reflog
ΑΝΑΓΝΩΡΙΣΤΕ ΠΡΙΝ ΤΗΝ ΕΠΑΝΑΦΟΡΑ
Επιλέξτε το σωστό reflog (f3cb6e2 στην περίπτωσή μου) και πληκτρολογήστε
επαναφορά git - σκληρό f3cb6e2
Μετά από αυτό το repo HEAD θα επαναφερθεί σε αυτό το HEADid
ΣΥΝΔΕΣΗ ΜΕΤΑ ΤΗΝ ΕΠΑΝΑΦΟΡΑ
Τέλος, το reflog μοιάζει με την παρακάτω εικόνα
ΤΕΛΙΚΟ REFLOG
|
Πρώτη εκτέλεση:
git reflog
Θα σας δείξει όλες τις πιθανές ενέργειες που έχετε εκτελέσει στο αποθετήριο σας, για παράδειγμα, δεσμεύστε, συγχωνεύστε, τραβήξτε κ.λπ.
Τότε κάνε:
επαναφορά git --hard ActionIdFromRefLog
|
Αναίρεση τελευταίας δέσμευσης:
επαναφορά git - soft HEAD ^ ή git reset - soft HEAD ~
Αυτό θα αναιρέσει την τελευταία δέσμευση.
Εδώ - Soft σημαίνει επαναφορά σε στάδια.
HEAD ~ ή HEAD ^ σημαίνει να προχωρήσετε στη δέσμευση πριν από το HEAD.
Αντικαταστήστε την τελευταία δέσμευση σε νέα δέσμευση:
git comm --amend -m "μήνυμα"
Θα αντικαταστήσει την τελευταία δέσμευση με τη νέα δέσμευση.
|
Ενας άλλος τρόπος:
Ελέγξτε τον κλάδο που θέλετε να επαναφέρετε και, στη συνέχεια, επαναφέρετε το τοπικό αντίγραφο εργασίας σας στη δέσμευση ότι θέλετε να είναι το πιο πρόσφατο στον απομακρυσμένο διακομιστή (όλα μετά από αυτό θα περάσουν αντίο). Για να το κάνετε αυτό, στο SourceTree έκανα δεξί κλικ στο και επέλεξα "Επαναφορά BRANCHNAME σε αυτήν την δέσμευση".
Στη συνέχεια, μεταβείτε στον τοπικό κατάλογο του αποθετηρίου σας και εκτελέστε αυτήν την εντολή:
git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f - ετικέτες REPOSITORY_NAMEBRANCHNAME: BRANCHNAME
Αυτό θα διαγράψει όλες τις δεσμεύσεις μετά την τρέχουσα στον τοπικό χώρο αποθήκευσης, αλλά μόνο για αυτόν τον κλάδο.
|
Πληκτρολογήστε git log και βρείτε τον τελευταίο κωδικό κατακερματισμού δεσμεύσεων και, στη συνέχεια, εισαγάγετε:
git reset <το προηγούμενο co>
|
Στην περίπτωσή μου, κατά λάθος διέπραξα ορισμένα αρχεία που δεν ήθελα. Έτσι έκανα τα εξής και λειτούργησε:
επαναφορά git - soft HEAD ^
git rm - cached [αρχεία που δεν χρειάζεστε]
git add [αρχεία που χρειάζεστε]
git commit -c ORIG_HEAD
Επαληθεύστε τα αποτελέσματα με gitk ή git log --stat
|
Απλό, εκτελέστε το στη γραμμή εντολών σας:
επαναφορά git - soft HEAD ~
|
Υπάρχουν δύο βασικά σενάρια
Δεν έχετε προωθήσει ακόμα τη δέσμευση
Εάν το πρόβλημα ήταν επιπλέον αρχεία που έχετε δεσμεύσει (και δεν θέλετε αυτά που βρίσκονται στο αποθετήριο), μπορείτε να τα καταργήσετε χρησιμοποιώντας το git rm και στη συνέχεια να το κάνετε με - τροποποίηση
git rm 
Μπορείτε επίσης να καταργήσετε ολόκληρους καταλόγους με -r ή ακόμα και να συνδυάσετε με άλλες εντολές Bash
git rm -r 
git rm $ (εύρεση -name '* .class')
Αφού αφαιρέσετε τα αρχεία, μπορείτε να δεσμεύσετε, με την επιλογή - τροποποίηση
git commit --amend -C HEAD # η επιλογή -C είναι να χρησιμοποιήσετε το ίδιο μήνυμα δέσμευσης
Αυτό θα ξαναγράψει την πρόσφατη τοπική σας δέσμευση για την κατάργηση των επιπλέον αρχείων, επομένως, αυτά τα αρχεία δεν θα σταλούν ποτέ σε push και επίσης θα αφαιρεθούν από το τοπικό αποθετήριο .git από την GC.
Πιέσατε ήδη τη δέσμευση
Μπορείτε να εφαρμόσετε την ίδια λύση του άλλου σεναρίου και στη συνέχεια να κάνετε git push με την επιλογή -f, αλλά δεν συνιστάται, καθώς αντικαθιστά το απομακρυσμένο ιστορικό με μια διαφορετική αλλαγή (μπορεί να βλάψει το αποθετήριο σας).
Αντ 'αυτού, πρέπει να κάνετε τη δέσμευση χωρίς - τροποποίηση (θυμηθείτε αυτό για το - amend ": Αυτή η επιλογή ξαναγράφει το ιστορικό στην τελευταία δέσμευση).
|
Για μια τοπική δέσμευση
επαναφορά git - soft HEAD ~ 1
ή αν δεν θυμάστε ακριβώς σε ποια δέσμευση είναι, μπορείτε να χρησιμοποιήσετε
git rm - προσωρινά αποθηκευμένο 
Για μια ώθηση
Ο σωστός τρόπος για την αφαίρεση αρχείων από το ιστορικό αποθετηρίου είναι η χρήση του git filter-branch. Αυτό είναι,
git filter-branch --index-filter "git rm - cached " HEAD
Ωστόσο, σας προτείνω να χρησιμοποιήσετε αυτήν την εντολή με προσοχή. Διαβάστε περισσότερα στο git-filter-branch (1) Manual Manual.
|
Για να επαναφέρετε την προηγούμενη αναθεώρηση, διαγράφοντας οριστικά όλες τις μη δεσμευμένες αλλαγές:
επαναφορά git - σκληρό HEAD ~ 1
|
ΤΙ ΝΑ ΧΡΗΣΙΜΟΠΟΙΕΙΤΕ, επαναφέρετε - μαλακό ή επαναφέρετε - σκληρό;
Προσθέτω μόνο δύο λεπτά για την απάντηση του @ Kyralessa:
Εάν δεν είστε σίγουροι τι να χρησιμοποιήσετε, πηγαίνετε στο --soft (χρησιμοποίησα αυτήν τη σύμβαση για να το θυμάμαι - μαλακό για ασφαλές).
Γιατί ?
Εάν επιλέξετε - σκληρό κατά λάθος, θα χάσετε τις αλλαγές σας όπως δεν ήταν πριν.
Εάν επιλέξετε - μαλακό κατά λάθος μπορείτε να επιτύχετε τα ίδια αποτελέσματα - σκληρά εφαρμόζοντας πρόσθετες εντολές
git reset HEAD file.html
git checkout - αρχείο.html
Πλήρες παράδειγμα
echo "μερικές αλλαγές ..."> file.html
git add file.html
git commit -m "λάθος δέσμευση"
# Πρέπει να κάνω επαναφορά
επαναφορά git - σκληρό HEAD ~ 1 (ακύρωση αλλαγών)
# Ή
git reset --soft HEAD ~ 1 # Επιστροφή στη σκηνή
git reset HEAD file.html # επιστροφή στον κατάλογο εργασίας
git checkout - file.html # ακύρωση αλλαγών
Οι πιστώσεις πηγαίνουν στο @Kyralessa.
|
1
2
3
Επόμενο
Πολύ ενεργή ερώτηση. Κερδίστε 10 φήμη για να απαντήσετε σε αυτήν την ερώτηση. Η απαίτηση φήμης συμβάλλει στην προστασία αυτής της ερώτησης από ανεπιθύμητες ενέργειες και μη απαντήσεις.
Δεν είναι η απάντηση που ψάχνετε; Περιηγηθείτε σε άλλες ερωτήσεις με ετικέτα git version-control git-commit undo ή κάντε τη δική σας ερώτηση.